package com.mashibing.common.valid;

import lombok.Data;
import lombok.experimental.Delegate;

import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;

/**
 * 使用Validated校验参数是为了进行分组校验，但是Validated无法像Valid一样进行级联和递归校验参数，
 * 所以为了递归校验列表中的每个对象中的参数，需要自定义一个VList，这个VList实现了List接口
 * VList内部有一个ArrayList对象，使用@Delegate注解是为了VList代理ArrayList中的方法
 * 使用@Valid注解是为了递归验证列表中的每一个对象中的参数
 * 在接口中进行使用时，表面上使用@Validated对VList进行分组校验
 * 而后，VList又将数据委托给内部的ArrayList进行递归校验
 * 这样，就解决了参数校验时，既要递归校验列表中的每一个对象中的参数，又要进行分组校验的难题
 */
@Data
public class VList<E> implements List<E> {

    @Valid
    @Delegate
    private List<E> list = new ArrayList<>();

}
